export interface VisibleDomRect {
    bottom: number;
    height: number;
    left: number;
    right: number;
    top: number;
    width: number;
}

/**
 * 获取元素可见信息
 * @param element
 */
export function getElementVisibleRect(
    element?: HTMLElement | null | undefined,
): VisibleDomRect {
    if (!element) {
        return {
            bottom: 0,
            height: 0,
            left: 0,
            right: 0,
            top: 0,
            width: 0,
        };
    }
    const rect = element.getBoundingClientRect();
    const viewHeight = Math.max(
        document.documentElement.clientHeight,
        window.innerHeight,
    );

    const top = Math.max(rect.top, 0);
    const bottom = Math.min(rect.bottom, viewHeight);

    const viewWidth = Math.max(
        document.documentElement.clientWidth,
        window.innerWidth,
    );

    const left = Math.max(rect.left, 0);
    const right = Math.min(rect.right, viewWidth);

    return {
        bottom,
        height: Math.max(0, bottom - top),
        left,
        right,
        top,
        width: Math.max(0, right - left),
    };
}

export function getScrollbarWidth() {
    const scrollDiv = document.createElement('div');

    scrollDiv.style.visibility = 'hidden';
    scrollDiv.style.overflow = 'scroll';
    scrollDiv.style.position = 'absolute';
    scrollDiv.style.top = '-9999px';

    document.body.append(scrollDiv);

    const innerDiv = document.createElement('div');
    scrollDiv.append(innerDiv);

    const scrollbarWidth = scrollDiv.offsetWidth - innerDiv.offsetWidth;

    scrollDiv.remove();
    return scrollbarWidth;
}

export function needsScrollbar() {
    const doc = document.documentElement;
    const body = document.body;

    // 检查 body 的 overflow-y 样式
    const overflowY = window.getComputedStyle(body).overflowY;

    // 如果明确设置了需要滚动条的样式
    if (overflowY === 'scroll' || overflowY === 'auto') {
        return doc.scrollHeight > window.innerHeight;
    }

    // 在其他情况下，根据 scrollHeight 和 innerHeight 比较判断
    return doc.scrollHeight > window.innerHeight;
}

export function triggerWindowResize(): void {
    // 创建一个新的 resize 事件
    const resizeEvent = new Event('resize');

    // 触发 window 的 resize 事件
    window.dispatchEvent(resizeEvent);
}
